package com.itheima.d8_generics_method;

import java.util.ArrayList;

/*
    1 泛型方法
        修饰符 <类型变量，类型变量，…>  返回值类型 方法名(形参列表) { }
    2 通配符
        就是 “?” ，可以在“使用泛型”的时候代表一切类型；  E T K V 是在定义泛型的时候使用。
    3 泛型的上下限(受限泛型)
        泛型上限:   ? extends Car :   ?  能接收的必须是Car或者其子类 。
        泛型下限：  ?  super Car :   ?  能接收的必须是Car或者其父类。
 */
public class Test {
    public static void main(String[] args) {
        ArrayList<Car> cars = new ArrayList<>();
        ArrayList<BMW3> bmw3 = new ArrayList<>();
        ArrayList<BMW> bmw = new ArrayList<>();
        ArrayList<BenZ> benZ = new ArrayList<>();
        ArrayList<Dog> dogs = new ArrayList<>();

        testrun(cars);
        testrun(bmw);
        testrun(bmw3);
        testrun(benZ);
        testrun(dogs);

        testrun1(cars);
        testrun1(dogs);
        testrun1(bmw);
        testrun1(bmw3);
        testrun1(benZ);

        testrun2(cars);
        testrun2(bmw);
        testrun2(bmw3);
        testrun2(benZ);


        testrun3(bmw);
        testrun3(bmw3);

        testrun4(cars);
        testrun4(bmw);


//        testrun2(dogs);
    }

    //模拟车队比赛
    public static <T> void testrun(ArrayList<T> cars) {

    }

    //使用通配符定义泛型方法
    public static void testrun1(ArrayList<?> cars) {

    }

    //使用通配符定义泛型方法
    public static void testrun2(ArrayList<? extends Car> cars) {

    }

    //传递BMW类型或者BMW的子类 规定类型上限
    public static void testrun3(ArrayList<? extends BMW> cars) {

    }

    //传递BMW类型或者BMW的父类 规定类型下限
    public static void testrun4(ArrayList<? super BMW> cars) {

    }
}

class Car {
}

class Dog {
}

class BMW extends Car {
}

class BMW3 extends BMW {
}

class BenZ extends Car {
}
